package manage.service;

import m.common.model.util.ModelQueryUtil;
import m.common.model.util.ModelUpdateUtil;
import m.common.service.Service;
import m.system.RuntimeData;
import m.system.db.DBManager;
import m.system.db.DataRow;
import m.system.db.SqlBuffer;
import m.system.exception.MException;
import m.system.util.DateUtil;
import m.system.util.FileUtil;
import m.system.util.GenerateID;
import m.system.util.StringUtil;
import manage.model.FileInfo;
import manage.model.ImageAdmin;

import java.io.File;
import java.sql.SQLException;
import java.util.Date;

public class FileInfoService extends Service {

	/**
	 * 保持文件  可调用方法，参数都不能为空
	 * path null或者/ 代表默认存放文件目录 /web/file（推荐，不会重复）
	 *      ""根目录（特殊需要，根目录验证文件）
	 *      类似"b/a" 存放在web/b/a目录下
	 */
	public static FileInfo saveFile(File file,String userOid,String fileType,String path,String businessOid) throws Exception {
		FileInfo fi=new FileInfo();
		fi.setImageAdmin(new ImageAdmin());
		fi.getImageAdmin().setOid(userOid);
		fi.setFileType(fileType);
		fi.setPath(path);
		fi.setBusinessOid(businessOid);
		fi.setName(file.getName().substring(file.getName().indexOf("_")+1));
		RuntimeData.getService(FileInfoService.class).saveFile(fi,file);
		return fi;
	}
	/**
	 * 保存文件  系统调用
	 */
	public void saveFile(FileInfo model, File file) throws Exception {
		if(StringUtil.isSpace(model.getBusinessOid())) throw new MException(this.getClass(), "业务主键不能为空");
		if(StringUtil.isSpace(model.getFileType())) throw new MException(this.getClass(), "文件类型不能为空");
		String key=GenerateID.generatePrimaryKey();
		if(null==model.getPath()||model.getPath().equals("/")) {//null or "/"  上传文件目录/file/...
			model.setPath(RuntimeData.getFilePath() + "file/" + DateUtil.format(new Date(), "yyyyMM") + "/");
			model.setFilePath(model.getPath() + key);
		}else if(!StringUtil.isSpace(model.getPath())){//非根目录  存放文件名唯一
			model.setFilePath(model.getPath() + key);
		}else {//跟目录
			model.setFilePath(model.getPath() + model.getName());
			verifyPower(model.getFilePath(), model.getImageAdmin().getOid());
		}
		model.setOid(key);
		model.setCreateDate(new Date());
		FileUtil.writePublicFile(model.getFilePath(), file);
		ModelUpdateUtil.insertModel(model);
	}
	private void verifyPower(String filePath,String adminOid) throws MException, SQLException {
		SqlBuffer sql=new SqlBuffer();
		sql.append("select image_admin_oid from os_file_info where file_path=?",filePath);
		DataRow dr=sql.queryFirstRow();
		if(null!=dr&&!dr.get(String.class,"image_admin_oid").equals(adminOid)) {
			throw new MException(this.getClass(), "该文件已被占用,无权上传修改");
		}
	}
	public String delete(ImageAdmin admin, String fileOid) throws Exception {
		FileInfo ii=new FileInfo();
		ii.setOid(fileOid);
		ii=ModelQueryUtil.getModel(ii);
		if(ii.getImageAdmin().getOid().equals(admin.getOid())){
			DataRow dr=DBManager.queryFirstRow("select file_path from os_file_info where oid=?",fileOid);
			if(!StringUtil.isSpace(dr.get(String.class, "file_path"))) FileUtil.deletePublicFile(dr.get(String.class, "file_path"));
			ModelUpdateUtil.deleteModel(ii);
			return fileOid;
		}else{
			throw new MException(this.getClass(),"不能删除不属于自己的文件");
		}
	}
}
